package aop.aspect;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @Author quan
 * @Description 定义一个切面：登录功能验证
 * @Date 2023/7/26 17:12
 */

@Component
@Slf4j
//表示是一个切面：CSDN，要结合五大注解使用
@Aspect
public class LoginAspect {

    //表示是一个切点：登录功能验证
    @Pointcut("execution(* aop.controller.UserController.*(..))")
    public void pointcut1(){ }
//    //1、前置通知使用@Before：通知方法会在目标方法调用之前执行。
//    @Before("pointcut1()")
//    public void doBefore(){
//        log.info("do before...");
//    }
//    //2、后置函数@After
//    @After("pointcut1()")
//    public void doAfter(){
//        log.info("do After...");
//    }
//
//    //3、@AfterReturning 在return 之前通知
//    @AfterReturning("pointcut1()")
//    public void doAfterReturning(){
//        log.info("do doAfterReturning...");
//    }
//
//    //4、@doAfterThrowing 在return 之前通知
//    @AfterThrowing("pointcut1()")
//    public void doAfterThrowing(){
//        log.info("do doAfterThrowing...");
//    }
//
//    //5、@doAround 环绕方法
//    @Around("pointcut1()")
//    //环绕方法要写返回结果  //ProceedingJoinPoint joinPoint表示连接点
//    public Object doAround(ProceedingJoinPoint joinPoint){
//        Object object = null;
//        log.info("环绕通知执行之前执行的方法...");
//        //执行目标方法
//        try {
//            object = joinPoint.proceed();
//        } catch (Throwable e) {
//            throw new RuntimeException(e);
//        }
//        log.info("环绕通知执行之后执行的方法...");
//        return object;
//    }

    /**
     * 计算UserController中所有方法的Log的执行时间
     */
    //表示是一个切点：登录功能验证
    @Pointcut("execution(* aop.controller.UserController.*(..))")
    public void pointcut2(){ }
    //@doAround 环绕方法
    @Around("pointcut2()")
    //环绕方法要写返回结果
    public Object doAround(ProceedingJoinPoint joinPoint){
        Object object = null;
        long start = System.currentTimeMillis();
        //执行目标方法
        try {
            object = joinPoint.proceed();
        } catch (Throwable e) {
            throw new RuntimeException(e);
        }
        //getSignature()) //获取修饰符+ 包名+组件名(类名) +方法名
        log.info(joinPoint.getSignature().toLongString()+"耗时"+(System.currentTimeMillis()-start));
        return object;
    }

}
